home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 25 / Cream of the Crop 25.iso / program / tcpdumpb.zip / print-atm.c < prev    next >
C/C++ Source or Header  |  1997-02-14  |  5KB  |  153 lines

  1. /*
  2.  * Copyright (c) 1994, 1995, 1996
  3.  *      The Regents of the University of California.  All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that: (1) source code distributions
  7.  * retain the above copyright notice and this paragraph in its entirety, (2)
  8.  * distributions including binary code include the above copyright notice and
  9.  * this paragraph in its entirety in the documentation or other materials
  10.  * provided with the distribution, and (3) all advertising materials mentioning
  11.  * features or use of this software display the following acknowledgement:
  12.  * ``This product includes software developed by the University of California,
  13.  * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
  14.  * the University nor the names of its contributors may be used to endorse
  15.  * or promote products derived from this software without specific prior
  16.  * written permission.
  17.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
  18.  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
  19.  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  20.  */
  21. #ifndef lint
  22. static char rcsid[] =
  23.     "@(#) $Header: print-atm.c,v 1.7 96/07/23 14:17:21 leres Exp $ (LBL)";
  24. #endif
  25.  
  26. #include <sys/param.h>
  27. #include <sys/time.h>
  28. #include <sys/socket.h>
  29.  
  30. #if __STDC__
  31. struct mbuf;
  32. struct rtentry;
  33. #endif
  34. #include <net/if.h>
  35.  
  36. #include <netinet/in.h>
  37. #include <netinet/if_ether.h>
  38. #include <netinet/in_systm.h>
  39. #include <netinet/ip.h>
  40. #ifndef __EMX__
  41. #include <netinet/ip_var.h>
  42. #endif
  43. #include <netinet/udp.h>
  44. #include <netinet/udp_var.h>
  45. #include <netinet/tcp.h>
  46. #ifndef __EMX__
  47. #include <netinet/tcpip.h>
  48. #endif
  49.  
  50. #include <stdio.h>
  51. #include <pcap.h>
  52.  
  53. #include "addrtoname.h"
  54. #include "ethertype.h"
  55. #include "interface.h"
  56.  
  57. /*
  58.  * This is the top level routine of the printer.  'p' is the points
  59.  * to the LLC/SNAP header of the packet, 'tvp' is the timestamp,
  60.  * 'length' is the length of the packet off the wire, and 'caplen'
  61.  * is the number of bytes actually captured.
  62.  */
  63. void
  64. atm_if_print(u_char *user, const struct pcap_pkthdr *h, const u_char *p)
  65. {
  66.         u_int caplen = h->caplen;
  67.         u_int length = h->len;
  68.         u_short ethertype;
  69.  
  70.         ts_print(&h->ts);
  71.  
  72.         if (caplen < 8) {
  73.                 printf("[|atm]");
  74.                 goto out;
  75.         }
  76.         if (p[0] != 0xaa || p[1] != 0xaa || p[2] != 0x03) {
  77.                 /*XXX assume 802.6 MAC header from fore driver */
  78.                 if (eflag)
  79.                         printf("%04x%04x %04x%04x ",
  80.                                p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3],
  81.                                p[4] << 24 | p[5] << 16 | p[6] << 8 | p[7],
  82.                                p[8] << 24 | p[9] << 16 | p[10] << 8 | p[11],
  83.                                p[12] << 24 | p[13] << 16 | p[14] << 8 | p[15]);
  84.                 p += 20;
  85.                 length -= 20;
  86.                 caplen -= 20;
  87.         }
  88.         ethertype = p[6] << 8 | p[7];
  89.         if (eflag)
  90.                 printf("%02x %02x %02x %02x-%02x-%02x %04x: ",
  91.                        p[0], p[1], p[2], /* dsap/ssap/ctrl */
  92.                        p[3], p[4], p[5], /* manufacturer's code */
  93.                        ethertype);
  94.  
  95.         /*
  96.          * Some printers want to get back at the ethernet addresses,
  97.          * and/or check that they're not walking off the end of the packet.
  98.          * Rather than pass them all the way down, we set these globals.
  99.          */
  100.         packetp = p;
  101.         snapend = p + caplen;
  102.  
  103.         length -= 8;
  104.         caplen -= 8;
  105.         p += 8;
  106.  
  107.         switch (ethertype) {
  108.  
  109.         case ETHERTYPE_IP:
  110.                 ip_print(p, length);
  111.                 break;
  112.  
  113.                 /*XXX this probably isn't right */
  114.         case ETHERTYPE_ARP:
  115.         case ETHERTYPE_REVARP:
  116.                 arp_print(p, length, caplen);
  117.                 break;
  118. #ifdef notyet
  119.         case ETHERTYPE_DN:
  120.                 decnet_print(p, length, caplen);
  121.                 break;
  122.  
  123.         case ETHERTYPE_ATALK:
  124.                 if (vflag)
  125.                         fputs("et1 ", stdout);
  126.                 atalk_print(p, length);
  127.                 break;
  128.  
  129.         case ETHERTYPE_AARP:
  130.                 aarp_print(p, length);
  131.                 break;
  132.  
  133.         case ETHERTYPE_LAT:
  134.         case ETHERTYPE_MOPRC:
  135.         case ETHERTYPE_MOPDL:
  136.                 /* default_print for now */
  137. #endif
  138.         default:
  139.                 /* ether_type not known, print raw packet */
  140.                 if (!eflag)
  141.                         printf("%02x %02x %02x %02x-%02x-%02x %04x: ",
  142.                                p[0], p[1], p[2], /* dsap/ssap/ctrl */
  143.                                p[3], p[4], p[5], /* manufacturer's code */
  144.                                ethertype);
  145.                 if (!xflag && !qflag)
  146.                         default_print(p, caplen);
  147.         }
  148.         if (xflag)
  149.                 default_print(p, caplen);
  150.  out:
  151.         putchar('\n');
  152. }
  153.